Introduction

Resolving geographic units that do not neatly coincide is a common problem in spatial data analysis. The method outline here attempts to conflate King County Health Reporting Areas (HRAs) to US Census tracts. In the cases where a given tract is entirely within an HRA, that tract receives the HRA’s unique identifier (HRA_ID). On the other hand, in cases where a given tract overlaps multiple HRAs, block-level census data is used to determine which HRA ID to assign to the tract.

Census Block Counts

This method provides three alternatives of block-level counts that can be used:

Count Type Variable ID Source
Population POP Table P1, U.S. Census Bureau, 2010 Census
Housing Units HU Table H1, U.S. Census Bureau, 2010 Census
Population in Housing Units HUPOP Table H10, U.S. Census Bureau, 2010 Census

The Algorithm

The following actions are performed in this method:

  1. Centroids of the census block polygons are calculated (class = SpatialPointsDataFrame)
  2. HRA IDs are passed to the block centroid using a spatial overlay method (sp::over())
  3. Blocks are aggregated into tracts and the count variables (POP,HU,POPHU) are summed
  4. For each count variable, the HRA ID with the highest sum is assigned to each tract

After running the assignment algorithm, it is clear that the POP and POPHU variables result in the same HRA assignments. HU differs from the other two variables in only 3 of the 398 tracts:

GEOID_TR HRA_POP HRA_POPHU HRA_HU
53033022202 Kirkland North Kirkland North Kirkland
53033025001 Bellevue-South Bellevue-South Newcastle/Four Creeks
53033028801 SeaTac/Tukwila SeaTac/Tukwila Des Moines/Normandy Park

Maps

LS0tCmFsd2F5c19hbGxvd19odG1sOiB5ZXMKZGZfcHJpbnQ6IHRpYmJsZQpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazoKICAgIGNvZGVfZm9sZGluZzogaGlkZQogIGh0bWxfZG9jdW1lbnQ6IGRlZmF1bHQKICBwZGZfZG9jdW1lbnQ6CiAgICBrZWVwX3RleDogeWVzCi0tLQoKYGBge3IgaHJhLXRyLXNldHVwLCBlY2hvID0gRkFMU0UsIHdhcm5pbmc9RkFMU0UsbWVzc2FnZT1GQUxTRSxjb21tZW50PUZBTFNFfQpsaWJyYXJ5KHBseXIpCmxpYnJhcnkoa25pdHIpCmxpYnJhcnkocnByb2pyb290KQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShyZ2RhbCkKbGlicmFyeShzcCkKbGlicmFyeShyZ2VvcykKbGlicmFyeShtaXNjZ2lzKQpsaWJyYXJ5KHRpZ3JpcykKbGlicmFyeShsZWFmbGV0KQpsaWJyYXJ5KGdndGhlbWVzKQpsaWJyYXJ5KG1hZ3JpdHRyKQpsaWJyYXJ5KHN0cmluZ3IpCmxpYnJhcnkoZG93bmxvYWRlcikKbGlicmFyeSh3ZWJzaG90KQpsaWJyYXJ5KGh0bWx0b29scykKbGlicmFyeShncGxvdHMpCmxpYnJhcnkoZ2dtYXApCmxpYnJhcnkoc2hpbnkpCmxpYnJhcnkoaHRtbHdpZGdldHMpCmxpYnJhcnkocmVhZHhsKQpsaWJyYXJ5KGFjcykKbGlicmFyeShSQ29sb3JCcmV3ZXIpCnJvb3QgPC0gcnByb2pyb290Ojppc19yc3R1ZGlvX3Byb2plY3QKcm9vdF9maWxlIDwtIHJvb3QkbWFrZV9maXhfZmlsZSgpCm9wdHNfY2h1bmskc2V0KGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGNvbW1lbnQ9RkFMU0UpCmBgYAoKIyMjIEludHJvZHVjdGlvbgpSZXNvbHZpbmcgZ2VvZ3JhcGhpYyB1bml0cyB0aGF0IGRvIG5vdCBuZWF0bHkgY29pbmNpZGUgaXMgYSBjb21tb24gcHJvYmxlbSBpbiBzcGF0aWFsIGRhdGEgYW5hbHlzaXMuIFRoZSBtZXRob2Qgb3V0bGluZSBoZXJlIGF0dGVtcHRzIHRvIGNvbmZsYXRlIEtpbmcgQ291bnR5IEhlYWx0aCBSZXBvcnRpbmcgQXJlYXMgKEhSQXMpIHRvIFVTIENlbnN1cyB0cmFjdHMuIEluIHRoZSBjYXNlcyB3aGVyZSBhIGdpdmVuIHRyYWN0IGlzIGVudGlyZWx5IHdpdGhpbiBhbiBIUkEsIHRoYXQgdHJhY3QgcmVjZWl2ZXMgdGhlIEhSQSdzIHVuaXF1ZSBpZGVudGlmaWVyIChIUkFfSUQpLiBPbiB0aGUgb3RoZXIgaGFuZCwgaW4gY2FzZXMgd2hlcmUgYSBnaXZlbiB0cmFjdCBvdmVybGFwcyBtdWx0aXBsZSBIUkFzLCBibG9jay1sZXZlbCBjZW5zdXMgZGF0YSBpcyB1c2VkIHRvIGRldGVybWluZSB3aGljaCBIUkEgSUQgdG8gYXNzaWduIHRvIHRoZSB0cmFjdC4gCgojIyMgQ2Vuc3VzIEJsb2NrIENvdW50cwpUaGlzIG1ldGhvZCBwcm92aWRlcyB0aHJlZSBhbHRlcm5hdGl2ZXMgb2YgYmxvY2stbGV2ZWwgY291bnRzIHRoYXQgY2FuIGJlIHVzZWQ6CgpgYGB7ciBocmEtdHItdmFydGFibGUsIGZpZy5jYXA9J0Jsb2NrLWxldmVsIGNvdW50cyd9CnRpYmJsZSgnQ291bnQgVHlwZScgPSBjKCdQb3B1bGF0aW9uJywKICAgICAgICAgICAgICAgICAgICAgICAgJ0hvdXNpbmcgVW5pdHMnLAogICAgICAgICAgICAgICAgICAgICAgICAnUG9wdWxhdGlvbiBpbiBIb3VzaW5nIFVuaXRzJyksCiAgICAgICAnVmFyaWFibGUgSUQnID0gYygnYFBPUGAnLAogICAgICAgICAgICAgICAgICAgICAgICAgJ2BIVWAnLAogICAgICAgICAgICAgICAgICAgICAgICAgJ2BIVVBPUGAnKSwKICAgICAgICdTb3VyY2UnID0gYygnVGFibGUgUDEsIFUuUy4gQ2Vuc3VzIEJ1cmVhdSwgMjAxMCBDZW5zdXMnLAogICAgICAgICAgICAgICAgICAgICdUYWJsZSBIMSwgVS5TLiBDZW5zdXMgQnVyZWF1LCAyMDEwIENlbnN1cycsCiAgICAgICAgICAgICAgICAgICAgJ1RhYmxlIEgxMCwgVS5TLiBDZW5zdXMgQnVyZWF1LCAyMDEwIENlbnN1cycpKSAlPiUgCiAgICAgICAga2FibGUoKQpgYGAKCiAgCmBgYHtyIGhyYS10ci1ibGtzfQoKaWYoIWZpbGUuZXhpc3RzKHJvb3RfZmlsZSgnMS1kYXRhLzQtaW50ZXJpbS9rYy1ibGstc3AuZ3BrZycpKSl7CiAgICAgICAgcG9wIDwtIHJlYWRfY3N2KHJvb3RfZmlsZSgnMS1kYXRhLzMtZXh0ZXJuYWwvbWFudWFsL3dhLWJsay9ERUNfMTBfU0YxX1AxL0RFQ18xMF9TRjFfUDFfd2l0aF9hbm4uY3N2JyksIAogICAgICAgICAgICAgICAgICAgICAgICBjb2xfdHlwZXMgPSBjb2xzKElkMiA9IGNvbF9jaGFyYWN0ZXIoKSksIAogICAgICAgICAgICAgICAgICAgICAgICBza2lwID0gMSkgJT4lIAogICAgICAgICAgICAgICAgbXV0YXRlKEdFT19JRF9CTEsgPSBJZDIsCiAgICAgICAgICAgICAgICAgICAgICAgR0VPSURfVFIgPSBzdWJzdHIoSWQyLHN0YXJ0ID0gMSxzdG9wID0gMTEpLAogICAgICAgICAgICAgICAgICAgICAgIFBPUCA9IFRvdGFsKSAlPiUgCiAgICAgICAgICAgICAgICBzZWxlY3QoR0VPX0lEX0JMSyxHRU9JRF9UUixQT1ApCiAgICAgICAgCiAgICAgICAgaHUgPC0gcmVhZF9jc3Yocm9vdF9maWxlKCcxLWRhdGEvMy1leHRlcm5hbC9tYW51YWwvd2EtYmxrL0RFQ18xMF9TRjFfSDEvREVDXzEwX1NGMV9IMV93aXRoX2Fubi5jc3YnKSwgCiAgICAgICAgICAgICAgICAgICAgICAgY29sX3R5cGVzID0gY29scyhJZDIgPSBjb2xfY2hhcmFjdGVyKCkpLCAKICAgICAgICAgICAgICAgICAgICAgICBza2lwID0gMSkgJT4lIAogICAgICAgICAgICAgICAgbXV0YXRlKEdFT19JRF9CTEsgPSBJZDIsCiAgICAgICAgICAgICAgICAgICAgICAgSFUgPSBUb3RhbCkgJT4lIAogICAgICAgICAgICAgICAgc2VsZWN0KEdFT19JRF9CTEssSFUpCiAgICAgICAgCiAgICAgICAgcG9waHUgPC0gcmVhZF9jc3Yocm9vdF9maWxlKCcxLWRhdGEvMy1leHRlcm5hbC9tYW51YWwvd2EtYmxrL0RFQ18xMF9TRjFfSDEwL0RFQ18xMF9TRjFfSDEwX3dpdGhfYW5uLmNzdicpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xfdHlwZXMgPSBjb2xzKElkMiA9IGNvbF9jaGFyYWN0ZXIoKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgIHNraXAgPSAxKSAlPiUgCiAgICAgICAgICAgICAgICBtdXRhdGUoR0VPX0lEX0JMSyA9IElkMiwKICAgICAgICAgICAgICAgICAgICAgICBQT1BIVSA9IFRvdGFsKSAlPiUgCiAgICAgICAgICAgICAgICBzZWxlY3QoR0VPX0lEX0JMSyxQT1BIVSkKICAgICAgICAKICAgICAgICBjbnRzIDwtIGxlZnRfam9pbihwb3AsaHUsYnkgPSAnR0VPX0lEX0JMSycpICU+JSAKICAgICAgICAgICAgICAgIGxlZnRfam9pbihwb3BodSxieSA9ICdHRU9fSURfQkxLJykKICAgICAgICAKICAgICAgICAjIFNvdXJjZSBmb3IgS0MgQmxvY2tzIHNwYXRpYWwgZGF0YQogICAgICAgIGlmKCFmaWxlLmV4aXN0cyhyb290X2ZpbGUoJzEtZGF0YS8zLWV4dGVybmFsL3dhLWJsay9ibG9ja3MxMC9ibG9ja3MxMC5zaHAnKSkpewogICAgICAgICAgICAgICAgdXJsIDwtICdmdHA6Ly9mdHAua2luZ2NvdW50eS5nb3YvZ2lzLXdlYi93ZWIvR0lTRGF0YS9ibG9ja3MxMF9TSFAuemlwJyAjIGRpcmVjdCBVUkwgdG8gdGhlIGZpbGUgZG93bmxvYWQKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdGVtcCA8LSB0ZW1wZmlsZSgpICMgY3JlYXRlIGEgdGVtcG9yYXJ5IGZpbGUgdG8gaG9sZCB0aGUgY29tcHJlc3NlZCBkb3dubG9hZAogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBkb3dubG9hZCh1cmwsIGRlc3QgPSB0ZW1wLCBtb2RlPSd3YicpICMgZG93bmxvYWQgdGhlIGZpbGUKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdW56aXAgKHRlbXAsIGV4ZGlyID0gcm9vdF9maWxlKCcxLWRhdGEvMy1leHRlcm5hbC93YS1ibGsnKSkgIyBleHRyYWN0IHRoZSBmaWxlIHRvIHRoZSBwcm9qZWN0IGZvbGRlcgogICAgICAgIH0KICAgICAgICAKICAgICAgICBrY19ibGsgPC0gcmVhZE9HUihkc24gPSByb290X2ZpbGUoJzEtZGF0YS8zLWV4dGVybmFsL3dhLWJsay9ibG9ja3MxMC8nKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBsYXllciA9ICdibG9ja3MxMCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyYm9zZSA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ3NBc0ZhY3RvcnMgPSBGQUxTRSkKICAgICAgICAKICAgICAgICBrY19ibGtAZGF0YSAlPD4lIGxlZnRfam9pbihjbnRzLCBieSA9ICdHRU9fSURfQkxLJykgJT4lIAogICAgICAgICAgICAgICAgc2VsZWN0KEdFT0lEX0JMSyA9IEdFT19JRF9CTEssCiAgICAgICAgICAgICAgICAgICAgICAgR0VPSURfVFI6UE9QSFUpCiAgICAgICAgCiAgICAgICAga2NfYmxrICU+JSB3cml0ZU9HUihkc24gPSByb290X2ZpbGUoJzEtZGF0YS80LWludGVyaW0va2MtYmxrLXNwLmdwa2cnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyID0gJ2tjX2Jsa19zcCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcml2ZXIgPSAnR1BLRycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVyd3JpdGVfbGF5ZXIgPSBUUlVFLHZlcmJvc2UgPSBGQUxTRSkKfQoKa2NfYmxrX3NwIDwtIHJlYWRPR1IoZHNuID0gcm9vdF9maWxlKCcxLWRhdGEvNC1pbnRlcmltL2tjLWJsay1zcC5ncGtnJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXllciA9ICdrY19ibGtfc3AnLAogICAgICAgICAgICAgICAgICBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgIHZlcmJvc2UgPSBGQUxTRSkKCgoKYGBgCgoKIyMjIFRoZSBBbGdvcml0aG0gClRoZSBmb2xsb3dpbmcgYWN0aW9ucyBhcmUgcGVyZm9ybWVkIGluIHRoaXMgbWV0aG9kOgoKICAxLiBDZW50cm9pZHMgb2YgdGhlIGNlbnN1cyBibG9jayBwb2x5Z29ucyBhcmUgY2FsY3VsYXRlZCAoYGNsYXNzID0gU3BhdGlhbFBvaW50c0RhdGFGcmFtZWApCiAgMi4gSFJBIElEcyBhcmUgcGFzc2VkIHRvIHRoZSBibG9jayBjZW50cm9pZCB1c2luZyBhIHNwYXRpYWwgb3ZlcmxheSBtZXRob2QgKGBzcDo6b3ZlcigpYCkKICAzLiBCbG9ja3MgYXJlIGFnZ3JlZ2F0ZWQgaW50byB0cmFjdHMgYW5kIHRoZSBjb3VudCB2YXJpYWJsZXMgKGBQT1BgLGBIVWAsYFBPUEhVYCkgYXJlIHN1bW1lZAogIDQuIEZvciBlYWNoIGNvdW50IHZhcmlhYmxlLCB0aGUgSFJBIElEIHdpdGggdGhlIGhpZ2hlc3Qgc3VtIGlzIGFzc2lnbmVkIHRvIGVhY2ggdHJhY3QKICAKYGBge3IgaHJhLWFzc2lnbn0KCiMgUGFzcyBIUkEgSURzIHRvIHRoZSBibG9jayBjZW50cm9pZHMKaHJhIDwtIHJlYWRPR1IoZHNuID0gcm9vdF9maWxlKCcxLWRhdGEvMy1leHRlcm5hbC9tYW51YWwvSFJBXzIwMTBCbG9ja19DbGlwLycpLGxheWVyID0gJ0hSQV8yMDEwQmxvY2tfQ2xpcCcsCiAgICAgICAgICAgICAgIHZlcmJvc2UgPSBGQUxTRSxzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpCgprY19ibGtfY250X3NwIDwtIFNwYXRpYWxQb2ludHNEYXRhRnJhbWUoY29vcmRzID0gcmdlb3M6OmdDZW50cm9pZChrY19ibGtfc3AsYnlpZCA9IFRSVUUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGFzLmRhdGEuZnJhbWUoa2NfYmxrX3NwQGRhdGEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2guSUQgPSBGQUxTRSkKCmtjX2Jsa19jbnRfc3AkSFJBX0lEIDwtIHNwOjpvdmVyKGtjX2Jsa19jbnRfc3AsaHJhWywnSFJBMjAxMHYyXyddKSAlPiUgdW5saXN0CgprY19ibGtfY250X3NwQGRhdGEgJTw+JSBtdXRhdGUoSFJBX0lEID0gaWZlbHNlKGlzLm5hKEhSQV9JRCksJ05vbmUnLEhSQV9JRCkpCgoKIyBBc3NpZ24gSFJBcyB0byB0cmFjdHMKIAppZighZmlsZS5leGlzdHMocm9vdF9maWxlKCcxLWRhdGEvNC1pbnRlcmltL2tjLWhyYS10ci1zcC5ncGtnJykpKXsKICAgICAgICBpZighZmlsZS5leGlzdHMocm9vdF9maWxlKCcxLWRhdGEvMy1leHRlcm5hbC9rYy10ci90cmFjdHMxMF9zaG9yZS90cmFjdHMxMF9zaG9yZS5zaHAnKSkpewogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB1cmwgPC0gJ2Z0cDovL2Z0cC5raW5nY291bnR5Lmdvdi9naXMtd2ViL3dlYi9HSVNEYXRhL3RyYWN0czEwX3Nob3JlX1NIUC56aXAnICMgZGlyZWN0IFVSTCB0byB0aGUgZmlsZSBkb3dubG9hZAogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB0ZW1wIDwtIHRlbXBmaWxlKCkgIyBjcmVhdGUgYSB0ZW1wb3JhcnkgZmlsZSB0byBob2xkIHRoZSBjb21wcmVzc2VkIGRvd25sb2FkCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGRvd25sb2FkKHVybCwgZGVzdCA9IHRlbXAsIG1vZGU9J3diJykgIyBkb3dubG9hZCB0aGUgZmlsZQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB1bnppcCAodGVtcCwgZXhkaXIgPSByb290X2ZpbGUoJzEtZGF0YS8zLWV4dGVybmFsL2tjLXRyJykpICMgZXh0cmFjdCB0aGUgZmlsZSB0byB0aGUgcHJvamVjdCBmb2xkZXIKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgCiAgICAgICAgfQogICAgICAgICAKICAgICAgICBrY190cl9zcCA8LSByZWFkT0dSKGRzbiA9IHJvb3RfZmlsZSgnMS1kYXRhLzMtZXh0ZXJuYWwva2MtdHIvdHJhY3RzMTBfc2hvcmUvJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXllciA9ICd0cmFjdHMxMF9zaG9yZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJib3NlID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpCiAgICAgICAga2NfdHJfc3BAZGF0YSAlPD4lIHNlbGVjdChHRU9JRF9UUiA9IEdFT19JRF9UUlQpCiAgICAgICAgCiAgICAgICAgZmlyc3Rfbm90TkEgPC0gZnVuY3Rpb24oeCl7Zmlyc3QoeFshaXMubmEoeCldKX0KICAgICAgICAKICAgICAgICB0cl9ocmFfaWRzIDwtIAogICAgICAgICAgICAgICAga2NfYmxrX2NudF9zcEBkYXRhICU+JSAKICAgICAgICAgICAgICAgIGFzLmRhdGEuZnJhbWUoKSAlPiUgCiAgICAgICAgICAgICAgICBnYXRoZXIoJ1ZBUicsJ0NPVU5UJyxQT1A6UE9QSFUpICU+JSAKICAgICAgICAgICAgICAgIGdyb3VwX2J5KEdFT0lEX1RSLFZBUixIUkFfSUQpICU+JSAKICAgICAgICAgICAgICAgIHN1bW1hcmlzZShTVU0gPSBzdW0oQ09VTlQpKSAlPiUgCiAgICAgICAgICAgICAgICBhcnJhbmdlKGRlc2MoU1VNKSkgJT4lIAogICAgICAgICAgICAgICAgc2xpY2UoMSkgJT4lIAogICAgICAgICAgICAgICAgc3ByZWFkKFZBUixIUkFfSUQpICU+JSAKICAgICAgICAgICAgICAgIG11dGF0ZShIVV9DTlQgPSBpZmVsc2UoIWlzLm5hKEhVKSxTVU0sTkFfaW50ZWdlcl8pLAogICAgICAgICAgICAgICAgICAgICAgIFBPUF9DTlQgPSBpZmVsc2UoIWlzLm5hKFBPUCksU1VNLE5BX2ludGVnZXJfKSwKICAgICAgICAgICAgICAgICAgICAgICBQT1BIVV9DTlQgPSBpZmVsc2UoIWlzLm5hKFBPUEhVKSxTVU0sTkFfaW50ZWdlcl8pKSAlPiUgCiAgICAgICAgICAgICAgICBzZWxlY3QoLVNVTSkgJT4lIAogICAgICAgICAgICAgICAgZ3JvdXBfYnkoR0VPSURfVFIpICU+JSAKICAgICAgICAgICAgICAgIHN1bW1hcmlzZV9hbGwoZnVucyhmaXJzdF9ub3ROQSkpICU+JSAKICAgICAgICAgICAgICAgIHVuZ3JvdXAoKSAlPiUgCiAgICAgICAgICAgICAgICBzZWxlY3QoR0VPSURfVFIsCiAgICAgICAgICAgICAgICAgICAgICAgUE9QID0gUE9QX0NOVCwKICAgICAgICAgICAgICAgICAgICAgICBIVSA9IEhVX0NOVCwKICAgICAgICAgICAgICAgICAgICAgICBQT1BIVSA9IFBPUEhVX0NOVCwKICAgICAgICAgICAgICAgICAgICAgICBIUkFfUE9QID0gUE9QLAogICAgICAgICAgICAgICAgICAgICAgIEhSQV9IVSA9IEhVLAogICAgICAgICAgICAgICAgICAgICAgIEhSQV9QT1BIVSA9IFBPUEhVKQogICAgICAgIAogICAgICAgIHRyX2hyYV9pZHMyIDwtIAogICAgICAgICAgICAgICAgdHJfaHJhX2lkcyAlPiUgCiAgICAgICAgICAgICAgICBzZWxlY3QoR0VPSURfVFIsbWF0Y2hlcygnSFJBJykpICU+JSAKICAgICAgICAgICAgICAgIGdhdGhlcigiVkFSIiwiSFJBIixtYXRjaGVzKCdIUkEnKSkgJT4lICAKICAgICAgICAgICAgICAgIGdyb3VwX2J5KEdFT0lEX1RSKSAlPiUgCiAgICAgICAgICAgICAgICBzdW1tYXJpc2UoQUxMRVEgPSBsZW5ndGgodW5pcXVlKEhSQSkpPT0xKSAlPiUKICAgICAgICAgICAgICAgIGxlZnRfam9pbih0cl9ocmFfaWRzLC4sYnkgPSAnR0VPSURfVFInKSAKICAgICAgICAKICAgICAgICAjIEdldCB0aGUgcGVyY2VudGFnZSBmb3IgZWFjaCBjb3VudCB2YXJpYWJsZQogICAgICAgIAogICAgICAgIHBvcF90ciA8LSAKICAgICAgICAgICAgICAgIHJlYWRfY3N2KHJvb3RfZmlsZSgiMS1kYXRhLzMtZXh0ZXJuYWwvbWFudWFsL2tjLXRyL0RFQ18xMF9TRjFfUDEvREVDXzEwX1NGMV9QMV93aXRoX2Fubi5jc3YiKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICBjb2xfdHlwZXMgPSBjb2xzKEdFTy5pZDIgPSBjb2xfY2hhcmFjdGVyKCksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZW9ncmFwaHkgPSBjb2xfc2tpcCgpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWQgPSBjb2xfc2tpcCgpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWQyID0gY29sX2NoYXJhY3RlcigpKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICBza2lwID0gMSkgJT4lIAogICAgICAgICAgICAgICAgc2VsZWN0KEdFT0lEX1RSID0gSWQyLAogICAgICAgICAgICAgICAgICAgICAgIFBPUF9UUiA9IFRvdGFsKQogICAgICAgIAogICAgICAgIGh1X3RyIDwtIAogICAgICAgICAgICAgICAgcmVhZF9jc3Yocm9vdF9maWxlKCcxLWRhdGEvMy1leHRlcm5hbC9tYW51YWwva2MtdHIvREVDXzEwX1NGMV9IMS9ERUNfMTBfU0YxX0gxX3dpdGhfYW5uLmNzdicpLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbF90eXBlcyA9IGNvbHMoR0VPLmlkMiA9IGNvbF9jaGFyYWN0ZXIoKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdlb2dyYXBoeSA9IGNvbF9za2lwKCksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZCA9IGNvbF9za2lwKCksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZDIgPSBjb2xfY2hhcmFjdGVyKCkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgIHNraXAgPSAxKSU+JSAKICAgICAgICAgICAgICAgIHNlbGVjdChHRU9JRF9UUiA9IElkMiwKICAgICAgICAgICAgICAgICAgICAgICBIVV9UUiA9IFRvdGFsKQogICAgICAgIAogICAgICAgIHBvcGh1X3RyIDwtIAogICAgICAgICAgICAgICAgcmVhZF9jc3Yocm9vdF9maWxlKCcxLWRhdGEvMy1leHRlcm5hbC9tYW51YWwva2MtdHIvREVDXzEwX1NGMV9IMTAvREVDXzEwX1NGMV9IMTBfd2l0aF9hbm4uY3N2JyksIAogICAgICAgICAgICAgICAgICAgICAgICAgY29sX3R5cGVzID0gY29scyhHRU8uaWQyID0gY29sX2NoYXJhY3RlcigpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2VvZ3JhcGh5ID0gY29sX3NraXAoKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElkID0gY29sX3NraXAoKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElkMiA9IGNvbF9jaGFyYWN0ZXIoKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgc2tpcCA9IDEpICU+JSAKICAgICAgICAgICAgICAgIHNlbGVjdChHRU9JRF9UUiA9IElkMiwKICAgICAgICAgICAgICAgICAgICAgICBQT1BIVV9UUiA9IFRvdGFsKQogICAgICAgIAogICAgICAgIGtjX3RyX3NwQGRhdGEgJTw+JQogICAgICAgICAgICAgICAgbGVmdF9qb2luKC4sdHJfaHJhX2lkczIsYnkgPSAnR0VPSURfVFInKSAlPiUgCiAgICAgICAgICAgICAgICBsZWZ0X2pvaW4oLixwb3BfdHIsYnkgPSAnR0VPSURfVFInKSAlPiUgCiAgICAgICAgICAgICAgICBsZWZ0X2pvaW4oLixodV90cixieSA9ICdHRU9JRF9UUicpICU+JSAKICAgICAgICAgICAgICAgIGxlZnRfam9pbiguLHBvcGh1X3RyLGJ5ID0gJ0dFT0lEX1RSJykgJT4lIAogICAgICAgICAgICAgICAgbXV0YXRlKFBPUF9QQ1QgPSByb3VuZF9hbnkoUE9QL1BPUF9UUixhY2N1cmFjeSA9IC4wMSksCiAgICAgICAgICAgICAgICAgICAgICAgSFVfUENUID0gcm91bmRfYW55KEhVL0hVX1RSLGFjY3VyYWN5ID0gLjAxKSwKICAgICAgICAgICAgICAgICAgICAgICBQT1BIVV9QQ1QgPSByb3VuZF9hbnkoUE9QSFUvUE9QSFVfVFIsYWNjdXJhY3kgPSAuMDEpKSAlPiUgCiAgICAgICAgICAgICAgICBzZWxlY3QoR0VPSURfVFIsCiAgICAgICAgICAgICAgICAgICAgICAgUE9QLFBPUF9QQ1QsCiAgICAgICAgICAgICAgICAgICAgICAgSFUsIEhVX1BDVCwKICAgICAgICAgICAgICAgICAgICAgICBQT1BIVSwgUE9QSFVfUENULGV2ZXJ5dGhpbmcoKSkKICAgICAgICAKICAgICAgICBrY190cl9zcCAlPiUgCiAgICAgICAgICAgICAgICB3cml0ZU9HUihkc24gPSByb290X2ZpbGUoJzEtZGF0YS80LWludGVyaW0va2MtaHJhLXRyLXNwLmdwa2cnKSwKICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyID0gJ2tjX2hyYV90cl9zcCcsCiAgICAgICAgICAgICAgICAgICAgICAgICBkcml2ZXIgPSAnR1BLRycsCiAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJib3NlID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICAgICBvdmVyd3JpdGVfbGF5ZXIgPSBUUlVFKQogICAgICAgIAp9CgprY19ocmFfdHJfc3AgPC0gCiAgICAgICAgcmVhZE9HUihkc24gPSByb290X2ZpbGUoJzEtZGF0YS80LWludGVyaW0va2MtaHJhLXRyLXNwLmdwa2cnKSwKICAgICAgICAgICAgICAgIGxheWVyID0gJ2tjX2hyYV90cl9zcCcsCiAgICAgICAgICAgICAgICB2ZXJib3NlID0gRkFMU0UpICU+JSAKICAgICAgICBzcFRyYW5zZm9ybShjcnNfcHJvaikKCmBgYAoKQWZ0ZXIgcnVubmluZyB0aGUgYXNzaWdubWVudCBhbGdvcml0aG0sIGl0IGlzIGNsZWFyIHRoYXQgdGhlIGBQT1BgIGFuZCBgUE9QSFVgIHZhcmlhYmxlcyByZXN1bHQgaW4gdGhlIHNhbWUgSFJBIGFzc2lnbm1lbnRzLiBgSFVgIGRpZmZlcnMgZnJvbSB0aGUgb3RoZXIgdHdvIHZhcmlhYmxlcyBpbiBvbmx5IDMgb2YgdGhlIDM5OCB0cmFjdHM6CgpgYGB7ciBocmEtYXNzaWduLXJlc3VsdHMsIGZpZy5jYXA9J0RpZmZlcmVuY2UgYmV0d2VlbiB0aGUgbWV0aG9kcyd9CgprY19ocmFfdHJfc3BAZGF0YSAlPiUgCiAgICAgICAgbXV0YXRlKEFMTEVRID0gYXMubG9naWNhbChBTExFUSkpICU+JSAKICAgICAgICBmaWx0ZXIoQUxMRVEgPT0gRkFMU0UpICU+JSAKICAgICAgICBzZWxlY3QoR0VPSURfVFIsSFJBX1BPUCxIUkFfUE9QSFUsSFJBX0hVKSAlPiUgCiAgICAgICAga2FibGUoY2FwdGlvbiA9ICdEaWZmZXJlbmNlIGJldHdlZW4gdGhlIG1ldGhvZHMnKQoKYGBgCgoKIyMjIE1hcHMKCgpgYGB7ciBocmEtbWFrZS1tYXBzfQoKbXlwYWwgPC0gUkNvbG9yQnJld2VyOjpicmV3ZXIucGFsKDgsbmFtZSA9ICdTZXQyJylbLThdCgpzaHVmZmxlZF9ocmFfcG9wIDwtIGZvcmNhdHM6OmZjdF9zaHVmZmxlKGtjX2hyYV90cl9zcCRIUkFfUE9QKSAlPiUgZmFjdG9yKG9yZGVyZWQgPSBUKQpzaHVmZmxlZF9ocmFfaHUgPC0gZm9yY2F0czo6ZmN0X3NodWZmbGUoa2NfaHJhX3RyX3NwJEhSQV9IVSkgJT4lIGZhY3RvcihvcmRlcmVkID0gVCkKc2h1ZmZsZWRfaHJhX3BvcGh1IDwtIGZvcmNhdHM6OmZjdF9zaHVmZmxlKGtjX2hyYV90cl9zcCRIUkFfUE9QSFUpICU+JSBmYWN0b3Iob3JkZXJlZCA9IFQpCgpwYWxfcG9wIDwtIGNvbG9yRmFjdG9yKHBhbGV0dGUgPSBteXBhbCxkb21haW4gPSBzaHVmZmxlZF9ocmFfcG9wKQpwYWxfaHUgPC0gY29sb3JGYWN0b3IocGFsZXR0ZSA9IG15cGFsLGRvbWFpbiA9IHNodWZmbGVkX2hyYV9odSkKcGFsX3BvcGh1IDwtIGNvbG9yRmFjdG9yKHBhbGV0dGUgPSBteXBhbCxkb21haW4gPSBzaHVmZmxlZF9ocmFfcG9waHUpCgpocmEgJTw+JSBzcFRyYW5zZm9ybShjcnNfcHJvaikKCnNob3dfaHJhX3RyX3BvcCA8LSBmdW5jdGlvbigpewogICAgICAgIG15TGZsdEdyZXkoYnVtcExhYmVscyA9IEZBTFNFLGhpZGVDb250cm9scyA9IEZBTFNFKSAlPiUKICAgICAgICBhZGRQcm92aWRlclRpbGVzKHByb3ZpZGVycyRDYXJ0b0RCKSAlPiUgCiAgICAgICAgYWRkUG9seWdvbnMoZGF0YSA9IGtjX2hyYV90cl9zcCwKICAgICAgICAgICAgICAgICAgICBzbW9vdGhGYWN0b3IgPSAwLAogICAgICAgICAgICAgICAgICAgIHdlaWdodCA9IDEsCiAgICAgICAgICAgICAgICAgICAgY29sb3IgPSBjb2wyaGV4KCJ3aGl0ZSIpLAogICAgICAgICAgICAgICAgICAgIG9wYWNpdHkgPSAuODUsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yID0gfnBhbF9wb3Aoc2h1ZmZsZWRfaHJhX3BvcCksCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHkgPSAuNSwKICAgICAgICAgICAgICAgICAgICBncm91cCA9ICdIUkEgVHJhY3QgYnkgUG9wLicsCiAgICAgICAgICAgICAgICAgICAgcG9wdXAgPSB+cGFzdGUwKGtjX2hyYV90cl9zcCRHRU9JRF9UUikpICU+JSAKICAgICAgICBhZGRQb2x5Z29ucyhkYXRhID0gaHJhLAogICAgICAgICAgICAgICAgICAgIHNtb290aEZhY3RvciA9IDAsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHkgPSAwLAogICAgICAgICAgICAgICAgICAgIHdlaWdodCA9IDIsCiAgICAgICAgICAgICAgICAgICAgY29sb3IgPSB+cGFsX3BvcChmYWN0b3IoaHJhJEhSQTIwMTB2Ml8sbGV2ZWxzID0gbGV2ZWxzKHNodWZmbGVkX2hyYV9wb3ApLG9yZGVyZWQgPSBUUlVFKSksCiAgICAgICAgICAgICAgICAgICAgb3BhY2l0eSA9IDEsCiAgICAgICAgICAgICAgICAgICAgZ3JvdXAgPSAnSFJBcycsCiAgICAgICAgICAgICAgICAgICAgcG9wdXAgPSB+cGFzdGUwKGhyYSRIUkEyMDEwdjJfKSkgJT4lIAogICAgICAgIGFkZExheWVyc0NvbnRyb2wob3ZlcmxheUdyb3VwcyA9IGMoJ0hSQSBUcmFjdCBieSBQb3AuJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdIUkFzJyksCiAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9ICd0b3ByaWdodCcsb3B0aW9ucyA9IGxheWVyc0NvbnRyb2xPcHRpb25zKEZBTFNFKSkKfQoKc2hvd19ocmFfdHJfaHUgPC0gZnVuY3Rpb24oKXsKICAgICAgICBteUxmbHRHcmV5KGJ1bXBMYWJlbHMgPSBGQUxTRSxoaWRlQ29udHJvbHMgPSBGQUxTRSkgJT4lCiAgICAgICAgYWRkUHJvdmlkZXJUaWxlcyhwcm92aWRlcnMkQ2FydG9EQikgJT4lIAogICAgICAgIGFkZFBvbHlnb25zKGRhdGEgPSBrY19ocmFfdHJfc3AsCiAgICAgICAgICAgICAgICAgICAgc21vb3RoRmFjdG9yID0gMCwKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQgPSAxLAogICAgICAgICAgICAgICAgICAgIGNvbG9yID0gY29sMmhleCgid2hpdGUiKSwKICAgICAgICAgICAgICAgICAgICBvcGFjaXR5ID0gLjg1LAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvciA9IH5wYWxfaHUoc2h1ZmZsZWRfaHJhX2h1KSwKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eSA9IC41LAogICAgICAgICAgICAgICAgICAgIGdyb3VwID0gJ0hSQSBUcmFjdCBieSBIVS4nLAogICAgICAgICAgICAgICAgICAgIHBvcHVwID0gfnBhc3RlMChrY19ocmFfdHJfc3AkR0VPSURfVFIpKSAlPiUgCiAgICAgICAgYWRkUG9seWdvbnMoZGF0YSA9IGhyYSwKICAgICAgICAgICAgICAgICAgICBzbW9vdGhGYWN0b3IgPSAwLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5ID0gMCwKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQgPSAyLAogICAgICAgICAgICAgICAgICAgIGNvbG9yID0gfnBhbF9odShmYWN0b3IoaHJhJEhSQTIwMTB2Ml8sbGV2ZWxzID0gbGV2ZWxzKHNodWZmbGVkX2hyYV9odSksb3JkZXJlZCA9IFRSVUUpKSwKICAgICAgICAgICAgICAgICAgICBvcGFjaXR5ID0gMSwKICAgICAgICAgICAgICAgICAgICBncm91cCA9ICdIUkFzJywKICAgICAgICAgICAgICAgICAgICBwb3B1cCA9IH5wYXN0ZTAoaHJhJEhSQTIwMTB2Ml8pKSAlPiUgCiAgICAgICAgYWRkTGF5ZXJzQ29udHJvbChvdmVybGF5R3JvdXBzID0gYygnSFJBIFRyYWN0IGJ5IEhVLicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSFJBcycpLAogICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSAndG9wcmlnaHQnLG9wdGlvbnMgPSBsYXllcnNDb250cm9sT3B0aW9ucyhGQUxTRSkpCn0KCnNob3dfaHJhX3RyX3BvcGh1IDwtIGZ1bmN0aW9uKCl7CiAgICAgICAgbXlMZmx0R3JleShidW1wTGFiZWxzID0gRkFMU0UsaGlkZUNvbnRyb2xzID0gRkFMU0UpICU+JQogICAgICAgIGFkZFByb3ZpZGVyVGlsZXMocHJvdmlkZXJzJENhcnRvREIpICU+JSAKICAgICAgICBhZGRQb2x5Z29ucyhkYXRhID0ga2NfaHJhX3RyX3NwLAogICAgICAgICAgICAgICAgICAgIHNtb290aEZhY3RvciA9IDAsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0ID0gMSwKICAgICAgICAgICAgICAgICAgICBjb2xvciA9IGNvbDJoZXgoIndoaXRlIiksCiAgICAgICAgICAgICAgICAgICAgb3BhY2l0eSA9IC44NSwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3IgPSB+cGFsX3BvcGh1KHNodWZmbGVkX2hyYV9wb3BodSksCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHkgPSAuNSwKICAgICAgICAgICAgICAgICAgICBncm91cCA9ICdIUkEgVHJhY3QgYnkgUG9wLiBpbiBIVScsCiAgICAgICAgICAgICAgICAgICAgcG9wdXAgPSB+cGFzdGUwKGtjX2hyYV90cl9zcCRHRU9JRF9UUikpICU+JSAKICAgICAgICBhZGRQb2x5Z29ucyhkYXRhID0gaHJhLAogICAgICAgICAgICAgICAgICAgIHNtb290aEZhY3RvciA9IDAsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHkgPSAwLAogICAgICAgICAgICAgICAgICAgIHdlaWdodCA9IDIsCiAgICAgICAgICAgICAgICAgICAgY29sb3IgPSB+cGFsX3BvcGh1KGZhY3RvcihocmEkSFJBMjAxMHYyXyxsZXZlbHMgPSBsZXZlbHMoc2h1ZmZsZWRfaHJhX3BvcGh1KSxvcmRlcmVkID0gVFJVRSkpLAogICAgICAgICAgICAgICAgICAgIG9wYWNpdHkgPSAxLAogICAgICAgICAgICAgICAgICAgIGdyb3VwID0gJ0hSQXMnLAogICAgICAgICAgICAgICAgICAgIHBvcHVwID0gfnBhc3RlMChocmEkSFJBMjAxMHYyXykpICU+JSAKICAgICAgICBhZGRMYXllcnNDb250cm9sKG92ZXJsYXlHcm91cHMgPSBjKCdIUkEgVHJhY3QgYnkgUG9wLiBpbiBIVScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSFJBcycpLAogICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSAndG9wcmlnaHQnLG9wdGlvbnMgPSBsYXllcnNDb250cm9sT3B0aW9ucyhGQUxTRSkpCn0KCiMgU2F2ZSB0aGUgbWFwcyBhcyBIVE1MIGRvY3VtZW50cwoKaWYoIWZpbGUuZXhpc3RzKHJvb3RfZmlsZSgnMy1jb21tdW5pY2F0aW9uL290aGVycy9odG1sL2hyYS10cmFjdHMtcG9wLmh0bWwnKSkpewogICAgICAgIHNob3dfaHJhX3RyX3BvcCgpICU+JSAKICAgICAgICBzYXZlV2lkZ2V0KGZpbGUgPSByb290X2ZpbGUoJzMtY29tbXVuaWNhdGlvbi9vdGhlcnMvaHRtbC9ocmEtdHJhY3RzLXBvcC5odG1sJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGZjb250YWluZWQgPSBGQUxTRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgbGliZGlyID0gcm9vdF9maWxlKCczLWNvbW11bmljYXRpb24vb3RoZXJzL2h0bWwvaHRtbF9zdXBwb3J0X2ZpbGVzJykpCn0KCmlmKCFmaWxlLmV4aXN0cyhyb290X2ZpbGUoJzMtY29tbXVuaWNhdGlvbi9vdGhlcnMvaHRtbC9ocmEtdHJhY3RzLWh1Lmh0bWwnKSkpewogICAgICAgIHNob3dfaHJhX3RyX3BvcCgpICU+JSAKICAgICAgICBzYXZlV2lkZ2V0KGZpbGUgPSByb290X2ZpbGUoJzMtY29tbXVuaWNhdGlvbi9vdGhlcnMvaHRtbC9ocmEtdHJhY3RzLWh1Lmh0bWwnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZmNvbnRhaW5lZCA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgICAgICBsaWJkaXIgPSByb290X2ZpbGUoJzMtY29tbXVuaWNhdGlvbi9vdGhlcnMvaHRtbC9odG1sX3N1cHBvcnRfZmlsZXMnKSkKfQoKaWYoIWZpbGUuZXhpc3RzKHJvb3RfZmlsZSgnMy1jb21tdW5pY2F0aW9uL290aGVycy9odG1sL2hyYS10cmFjdHMtcG9waHUuaHRtbCcpKSl7CiAgICAgICAgc2hvd19ocmFfdHJfcG9wKCkgJT4lIAogICAgICAgIHNhdmVXaWRnZXQoZmlsZSA9IHJvb3RfZmlsZSgnMy1jb21tdW5pY2F0aW9uL290aGVycy9odG1sL2hyYS10cmFjdHMtcG9waHUuaHRtbCcpLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmY29udGFpbmVkID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpYmRpciA9IHJvb3RfZmlsZSgnMy1jb21tdW5pY2F0aW9uL290aGVycy9odG1sL2h0bWxfc3VwcG9ydF9maWxlcycpKQp9CgoKYGBgCgoKYGBge3IgaHJhLXNob3ctcG9wLCBmaWcuY2FwPSdIUkEgQ2Vuc3VzIFRyYWN0cyAoYnkgUG9wdWxhdGlvbiknfQpzaG93X2hyYV90cl9wb3AoKQoKYGBgCgpgYGB7ciBocmEtc2hvdy1odSwgZmlnLmNhcD0nSFJBIENlbnN1cyBUcmFjdHMgKGJ5IEhvdXNpbmcgVW5pdHMpJ30Kc2hvd19ocmFfdHJfaHUoKQoKYGBgCgpgYGB7ciBocmEtc2hvdy1wb3BodSwgZmlnLmNhcD0nSFJBIENlbnN1cyBUcmFjdHMgKGJ5IFBvcHVsYXRpb24gaW4gSG91c2luZyBVbml0cyknfQpzaG93X2hyYV90cl9wb3BodSgpCgpgYGAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo=